<?php
namespace app\console\behavior;
use app\console\model\Base;
use think\facade\Hook;
use think\facade\Request;
use think\Db;
class MultiPic extends Base
{
    /*
     * 写入前上传图片，然后写入后修改到指定目录内
     * 提交按钮才提交数据
     */
    private $controller = null;
    private $class = null;
    private $model = null;

    public function initialize()
    {
        $this->controller = Request::controller(true);
        $this->class = '\app\console\model\\'.Request::controller();
        $this->model = new $this->class;
    }

    /**
     * 用于上传后台图片移动到指定目录和id下
     * @param $data
     * 原movePic
     */
    public function after_write($data,$file_field = 'multi_pic')
    {
//        dump($_FILES);
//        dump(\request()->file());
//        dump($data);
//        halt(Request::param());
        if (is_array($data)) {
            $file_field = $data[1];
            $data = $data[0];
        }
        $controller = Request::controller(true);

        $ret = [];

        if(!empty($data->multi_pic)){ //不为空，否则,手动删除会报错
            foreach(($data->multi_pic) as $v){
                $arr_value = current(explode('/',$v));
                if($arr_value != $data->id)
                {
                    (new \FileUtil())->moveFile('uploads/'.$controller.'/'.$v,'uploads/'.$controller.'/'.$data->id.'/'.$v);
                    $ret[] = $data->id.'/'.$v;

                }else{
                    $ret[] = $v;
                }
                Db::name($controller)->where('id',$data->id)->setField($file_field,serialize($ret));
            }
        }

    }

    public function before_delete($data,$file_field = 'multi_pic')
    {
        $sql = "SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '" . config('database.prefix') . $this->controller . "' AND table_schema = '" . config('database.database') . "' and  COLUMN_NAME = 'parent_id'";
        $ret = Db::query($sql);
        if (empty($ret)) { //如果不存在此列
            $str = $data[0]->id;
        } else {
            $str = sonPath($this->model->select(), $data[0]->id, true);//包含自己的图片
        }
        if (is_array($data)) {
            $file_field = $data[1];
            $data = $data[0];
        }
        $multi_pic = $this->model->where('id', 'in', $str)->column("id,{$file_field}");
        foreach ($multi_pic as $k => $v) { //先删除本地图片包含当前类
            foreach (unserialize($v) as $vv) {
                if (file_exists('./uploads/' . $this->controller . '/' . $vv)) //
                {
                    $_v = explode('/', substr($vv, 0, -4));//先去掉后缀在获取原图片路径
                    $file_list = scandir('./uploads/' . $this->controller . '/' . $k);
                    krsort($file_list);
//                    array(4) {
//                    [3] => string(59) "20180925152234_fcb551f5f2dfda07fa0414d9fb4fb683_154_144.jpg"
//                    [2] => string(51) "20180925152234_fcb551f5f2dfda07fa0414d9fb4fb683.jpg"
//                    [1] => string(2) ".."
//                    [0] => string(1) "."

                    array_splice($file_list, -2);//-2 意味着从数组的倒数第二个元素开始。
                    foreach ($file_list as $kf => $vf) {
                        $str = substr($vf, 0, -4);
                        if (strpos(substr($vf, 0, -4), $_v[1]) !== false) {
                            unlink('./uploads/' . $this->controller . '/' . $_v[0] . '/' . $vf);
                        }
                    }
                    //unlink('./uploads/'.$controller.'/' . $v);
                }
            }
        }
        $this->model->where('id', 'in', $str)->delete();//在删除数据
    }


    public function before_write($data,$file_field = 'multi_pic'){

//        $files = [];
//        foreach ($_FILES[$file_field]['name'] as $k => $v){
//            //$files只接受有效文本流,我们也需要无效的图片位置key,代表第2和第4图片是修改的文本流
//            /*
//             *    array(4) {
//                  [0] => string(0) ""
//                  [1] => string(5) "0.jpg"
//                  [2] => string(0) ""
//                  [3] => string(36) "44e505ed1c273f2a3594ddf422a4e847.jpg"
//            }
//             * */
//
//            if($v){
//                $files[$k]['name'] = $v;
//                $files[$k]['type'] = $_FILES[$file_field]['type'][$k];
//                $files[$k]['tmp_name'] = $_FILES[$file_field]['tmp_name'][$k];
//                $files[$k]['error'] = $_FILES[$file_field]['error'][$k];
//                $files[$k]['size'] = $_FILES[$file_field]['size'][$k];
//            }
//
//        }
//        $this->arrayToObject($files);

        $files = request()->file('multi_pic');

        if (is_array($data)) {
            $file_field = $data[1];
            $data = $data[0];
        }



        $multi_pic_url = $file_field.'_url';
        $module = Request::module();
        $controller = Request::controller(true);
        $action = Request::action();
        $img_array = Request::param();
        /* $data->$file_field
         * array(2) {
            [0] => string(53) "4/20180901111144_d2055382d86bceba4704e5d0e1db5be7.jpg"
            [1] => string(53) "4/20180901111217_c26b4ee8bfb2b100148eb07f2264726b.jpg"
            }
         * */

        if($action == 'destory' && $data->$file_field){
            foreach (unserialize($data->$file_field) as $k => $v){
                if(file_exists('./uploads/'.$controller.'/' . $v)) //
                {
                    $_v = explode('/',substr($v,0,-4));//先去掉后缀在获取原图片路径
                    $file_list = scandir('./uploads/'.$controller.'/'.$data->id);
                    krsort($file_list);
                    array_splice($file_list,-2);
                    foreach ($file_list as $kf => $vf){
                        $str = substr($vf,0,-4);
                        if(strpos(substr($vf,0,-4),$_v[1]) !== false){
                            unlink('./uploads/'.$controller.'/' .$_v[0].'/'. $vf);
                        }
                    }
                    //unlink('./uploads/'.$controller.'/' . $v);
                    //rmdir($file_list);//rmdir() 函数删除空的目录。若成功，则该函数返回 true。若失败，则返回 false。
                }

            }
            return false;
        }

        if($action == 'update'){

            //$img_array[$multi_pic_url] 再次提交过来的数据
            $multi_pic_value = unserialize(db($controller)->where('id', $img_array['id'])->value($file_field));//sql数据表里原数据
            if(isset($img_array[$multi_pic_url])){
                $save_img = array_intersect($multi_pic_value, $img_array[$multi_pic_url]);//比较两个数组的键值，并返回交集：用于再次保存,仅用于没有修改图片的情况下删减
                $unset_img = array_diff($multi_pic_value, $img_array[$multi_pic_url]);//比较两个数组的键值，并返回差集：sql原数据-当前保留数据= 要去掉的数据图片
                //添加多余的图片上传在处理
                //ps.数据里有4个图片，然后保留2个，另外2个图片删除掉;
                foreach ($unset_img as $v) {
                    if(file_exists('./uploads/'.$controller.'/' . $v))
                    {
                        $_v = explode('/',substr($v,0,-4));//先去掉后缀在获取原图片路径
                        try {
                            $file_list = scandir('./uploads/' . $controller . '/' . $data->id);
                            krsort($file_list);
                            array_splice($file_list,-2);
                            foreach ($file_list as $kf => $vf){ //所有相关图片以及各种水印缩略图全部删除
                                $str = substr($vf,0,-4);
                                if(!empty($v[1])){
                                    if(strpos(substr($vf,0,-4),$_v[1]) !== false){
                                        unlink('./uploads/'.$controller.'/' .$_v[0].'/'. $vf);
                                    }
                                }

                            }
                        } catch (\Exception $e) {
                        }


                        //unlink('./uploads/'.$controller.'/' . $v);//原图片
                    }
                }
            }

        } //如果是修改

        if(!empty($files))
        {

            $ret = [];
            foreach ($_FILES[$file_field]['name'] as $k => $v){
                //$files只接受有效文本流,我们也需要无效的图片位置key,代表第2和第4图片是修改的文本流
                /*
                 *    array(4) {
                      [0] => string(0) ""
                      [1] => string(5) "0.jpg"
                      [2] => string(0) ""
                      [3] => string(36) "44e505ed1c273f2a3594ddf422a4e847.jpg"
                }
                 * */
                if($v == '') unset($_FILES[$file_field]['name'][$k]);//废掉没有选择的空图片,下面处理key 1 3 图片
            }
            $i = 0;
            foreach($files as $k =>$file){
                // 移动到框架应用根目录/public/uploads/ 目录下
                $info = $file->move('./uploads/'. $controller,savePicName());
                if($info){
                    if($action == 'create'){
                        $ret[] = $info->getSaveName();
                    }elseif($action == 'update'){
                        //图片上传修改部分.修改的图片序号保留
                        $ret[array_keys($_FILES[$file_field]['name'])[$i]] = $info->getSaveName();
                        //上面已经废除无文本流图片,所以$_FILES[$file_field]['name'])[$i]的顺序和$files的顺序现在相同的,但是key保留
                    }
                    $i++;
                }else{
                    // 上传失败获取错误信息
                    return $file->getError();
                }
                /* $img_array[$multi_pic_url] 准备提交过来的图片
                 * array(3) {
                  [0] => string(48) "10/20180702/6fb0224f1f23bd0f4a5b723faa06af53.jpg"
                  [1] => string(48) "10/20180702/0af6106d7f7d6ec071ef2a65e6032f74.jpg"
                  [2] => string(48) "10/20180704/d82e77adbbcef3ca25c70e7114898469.png"
                    }
                 *
                 *
                 * */
                if(isset($img_array[$multi_pic_url]) && !empty($img_array[$multi_pic_url])){ //添加数据时候没有这个字段
                    foreach ($img_array[$multi_pic_url] as $k => $v){
                        if(in_array($k,array_keys($ret))){ //删除上传替换的图片
                            if(file_exists('./uploads/'.$controller.'/' . $v)) //原图片存在就执行删除，以下删除所有图片
                            {
                                $_v = explode('/',substr($v,0,-4));//先去掉后缀在获取原图片路径
                                try {
                                    $file_list = scandir('./uploads/' . $controller . '/' . $data->id);
                                    krsort($file_list);//倒叙排列
                                    array_splice($file_list, -2);//去掉. ..
                                    foreach ($file_list as $kf => $vf) {
                                        $str = substr($vf, 0, -4);
                                        if (!empty($v[1])) {
                                            if (strpos(substr($vf, 0, -4), $_v[1]) !== false) {
                                                unlink('./uploads/' . $controller . '/' . $_v[0] . '/' . $vf);
                                            }
                                        }

                                    }
                                } catch (\Exception $e) {
                                }
                                //unlink('./uploads/'.$controller.'/' . $v);
                            }
                        }
                    }
                }

            }
            if ($action == 'update') {   //上传后的部分图片替换sql原数据图片,一起再次保存
                if (isset($img_array[$multi_pic_url])) {
                    $ret = $ret + $img_array[$multi_pic_url];
                    ksort($ret);
                    return serialize($ret);
                }

            }
            return serialize($ret);

        }else{
            if($action == 'create'){
                throw new \Exception('添加图片不能为空...');
            }
            if($action == 'destory'){
                return false;
            }

            if(isset($save_img)){ //用于首页更新未定义 $save_img;
                return serialize($save_img);
            }

        }


    }




//    public function uploadMany($file_field = 'multi_pic',$data){
//
//        $files = request()->file($file_field);
//        $multi_pic_url = $file_field.'_url';
//        $module = Request::module();
//        $controller = Request::controller(true);
//        $action = Request::action();
//        $img_array = Request::param();
//        /* $data->$file_field
//         * array(2) {
//            [0] => string(53) "4/20180901111144_d2055382d86bceba4704e5d0e1db5be7.jpg"
//            [1] => string(53) "4/20180901111217_c26b4ee8bfb2b100148eb07f2264726b.jpg"
//            }
//         * */
//        if($action == 'destory' && $data->$file_field){
//            foreach (unserialize($data->$file_field) as $k => $v){
//                if(file_exists('./uploads/'.$controller.'/' . $v)) //
//                {
//                    $_v = explode('/',substr($v,0,-4));//先去掉后缀在获取原图片路径
//                    $file_list = scandir('./uploads/'.$controller.'/'.$data->id);
//                    krsort($file_list);
//                    array_splice($file_list,-2);
//                    foreach ($file_list as $kf => $vf){
//                        $str = substr($vf,0,-4);
//                        if(strpos(substr($vf,0,-4),$_v[1]) !== false){
//                            unlink('./uploads/'.$controller.'/' .$_v[0].'/'. $vf);
//                        }
//                    }
//                    //unlink('./uploads/'.$controller.'/' . $v);
//                }
//            }
//            return false;
//        }
//
//        if($action == 'update'){
//            //$img_array[$multi_pic_url] 再次提交过来的数据
//            $multi_pic_value = unserialize(db($controller)->where('id', $img_array['id'])->value($file_field));//sql数据表里原数据
//            $save_img = array_intersect($multi_pic_value, $img_array[$multi_pic_url]);//比较两个数组的键值，并返回交集：用于再次保存,仅用于没有修改图片的情况下删减
//            $unset_img = array_diff($multi_pic_value, $img_array[$multi_pic_url]);//比较两个数组的键值，并返回差集：sql原数据-当前保留数据= 要去掉的数据图片
//            //添加多余的图片上传在处理
//            //ps.数据里有4个图片，然后保留2个，另外2个图片删除掉;
//            foreach ($unset_img as $v) {
//                if(file_exists('./uploads/'.$controller.'/' . $v))
//                {
//                    $_v = explode('/',substr($v,0,-4));//先去掉后缀在获取原图片路径
//                    $file_list = scandir('./uploads/'.$controller.'/'.$data->id);
//                    krsort($file_list);
//                    array_splice($file_list,-2);
//                    foreach ($file_list as $kf => $vf){ //所有相关图片以及各种水印缩略图全部删除
//                        $str = substr($vf,0,-4);
//                        if(!empty($v[1])){
//                            if(strpos(substr($vf,0,-4),$_v[1]) !== false){
//                                unlink('./uploads/'.$controller.'/' .$_v[0].'/'. $vf);
//                            }
//                        }
//
//                    }
//                    //unlink('./uploads/'.$controller.'/' . $v);//原图片
//                }
//            }
//        } //如果是修改
//        if(!empty($files))
//        {
//            $ret = [];
//            foreach ($_FILES[$file_field]['name'] as $k => $v){
//                //$files只接受有效文本流,我们也需要无效的图片位置key,代表第2和第4图片是修改的文本流
//                /*
//                 *    array(4) {
//                      [0] => string(0) ""
//                      [1] => string(5) "0.jpg"
//                      [2] => string(0) ""
//                      [3] => string(36) "44e505ed1c273f2a3594ddf422a4e847.jpg"
//                }
//                 * */
//                if($v == '') unset($_FILES[$file_field]['name'][$k]);//废掉没有选择的空图片,下面处理key 1 3 图片
//            }
//            $i = 0;
//            foreach($files as $k =>$file){
//                // 移动到框架应用根目录/public/uploads/ 目录下
//                $info = $file->move('./uploads/'. $controller,savePicName());
//                if($info){
//                    if($action == 'create'){
//                        $ret[] = $info->getSaveName();
//                    }elseif($action == 'update'){
//                        //图片上传修改部分.修改的图片序号保留
//                        $ret[array_keys($_FILES[$file_field]['name'])[$i]] = $info->getSaveName();
//                        //上面已经废除无文本流图片,所以$_FILES[$file_field]['name'])[$i]的顺序和$files的顺序现在相同的,但是key保留
//                    }
//                    $i++;
//                }else{
//                    // 上传失败获取错误信息
//                    return $file->getError();
//                }
//                /* $img_array[$multi_pic_url] 准备提交过来的图片
//                 * array(3) {
//                  [0] => string(48) "10/20180702/6fb0224f1f23bd0f4a5b723faa06af53.jpg"
//                  [1] => string(48) "10/20180702/0af6106d7f7d6ec071ef2a65e6032f74.jpg"
//                  [2] => string(48) "10/20180704/d82e77adbbcef3ca25c70e7114898469.png"
//                    }
//                 *
//                 *
//                 * */
//                if(isset($img_array[$multi_pic_url]) && !empty($img_array[$multi_pic_url])){//添加数据时候没有这个字段
//                    foreach ($img_array[$multi_pic_url] as $k => $v){
//                        if(in_array($k,array_keys($ret))){ //删除上传替换的图片
//                            if(file_exists('./uploads/'.$controller.'/' . $v)) //原图片存在就执行删除，以下删除所有图片
//                            {
//                                $_v = explode('/',substr($v,0,-4));//先去掉后缀在获取原图片路径
//                                $file_list = scandir('./uploads/'.$controller.'/'.$data->id);
//                                krsort($file_list);//倒叙排列
//                                array_splice($file_list,-2);//去掉. ..
//                                foreach ($file_list as $kf => $vf){
//                                    $str = substr($vf,0,-4);
//                                    if(!empty($v[1])){
//                                        if(strpos(substr($vf,0,-4),$_v[1]) !== false){
//                                            unlink('./uploads/'.$controller.'/' .$_v[0].'/'. $vf);
//                                        }
//                                    }
//
//                                }
//                                //unlink('./uploads/'.$controller.'/' . $v);
//                            }
//                        }
//                    }
//                }
//
//            }
//            if($action == 'update')
//            {   //上传后的部分图片替换sql原数据图片,一起再次保存
//                $ret = $ret+$img_array[$multi_pic_url];
//                ksort($ret);
//                return serialize($ret);
//            }
//            return serialize($ret);
//
//        }else{
//            if($action == 'create'){
//                throw new Exception('添加图片不能为空');
//            }
//            if($action == 'destory'){
//                return false;
//            }
//            return serialize($save_img);
//        }
//
//    }


}